package zhoufu.sz.sanxiao_check.event;

import rx.Observable;
import rx.subjects.PublishSubject;
import rx.subjects.SerializedSubject;
import rx.subjects.Subject;

/**
 * User:RCP
 * email:ruancaipu@gmail.com
 * Date:2016/7/19
 */
public class RxBus
{
    private static volatile RxBus   defaultInstance;
    // 主题
    private final           Subject bus;

    // PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者
    public RxBus()
    {
        bus = new SerializedSubject<>(PublishSubject.create());
    }

    // 单例RxBus
    public static RxBus getDefault()
    {
        RxBus rxBus = defaultInstance;
        if ( defaultInstance == null )
        {
            synchronized (RxBus.class)
            {
                rxBus = defaultInstance;
                if ( defaultInstance == null )
                {
                    rxBus = new RxBus();
                    defaultInstance = rxBus;
                }
            }
        }
        return rxBus;
    }

    // 提供了一个新的事件
    public void post(Object o)
    {
        bus.onNext(o);
    }

    // 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者
    public <T> Observable<T> toObserverable(Class<T> eventType)
    {
        return bus.ofType(eventType);
    }

    /**
     * 判断是否有观察者订阅
     */
    public boolean hasObservers()
    {
        return bus.hasObservers();
    }
}
